package com.zhentao.handler;

import com.alibaba.otter.canal.protocol.CanalEntry;
import com.xpand.starter.canal.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @ClassName: CanalDataEventListener
 * @Author: 振涛教育_Q
 * @Date: 2024/12/9 18:35
 */
@Component
@CanalEventListener
public class CanalDataEventListener {
    private static final Logger logger = LoggerFactory.getLogger(CanalDataEventListener.class);

    /**
     * 处理插入数据的监听方法
     * 当数据库中有数据插入操作时，此方法会被触发，用于处理插入后的数据展示逻辑
     *
     * @param entry     包含了本次数据变更的详细信息，例如所属事务、对应的表等信息，通过它可解析出具体的行数据变更情况
     * @param rowChange 表示行数据的变更对象，从中可以获取到插入的具体行数据信息
     */
    @InsertListenPoint
    public void onEventInsert(CanalEntry.Entry entry, CanalEntry.RowChange rowChange) {
        List<CanalEntry.RowData> rowDatas = rowChange.getRowDatasList();
        for (CanalEntry.RowData rowData : rowDatas) {
            logger.info("监听到插入数据，详细信息如下：");
            rowData.getAfterColumnsList().forEach(column -> logger.info("字段名: {} ，字段值: {}", column.getName(), column.getValue()));
        }
    }

    /**
     * 处理更新数据的监听方法
     * 当数据库中发生数据更新操作时，此方法会被调用，执行相应的数据处理逻辑，这里主要是打印更新后的数据信息
     *
     * @param entry     包含了本次数据变更的详细信息，例如所属事务、对应的表等信息，通过它可解析出具体的行数据变更情况
     * @param rowChange 表示行数据的变更对象，从中可以获取到更新后的具体行数据信息
     */
    @UpdateListenPoint
    public void onEventUpdate(CanalEntry.Entry entry, CanalEntry.RowChange rowChange) {
        System.err.println(1111);
        logger.info("监听到数据更新，更新后的数据信息如下：");
        List<CanalEntry.RowData> rowDatas = rowChange.getRowDatasList();
        for (CanalEntry.RowData rowData : rowDatas) {
            rowData.getAfterColumnsList().forEach(column -> logger.info("字段名: {} ，字段值: {}", column.getName(), column.getValue()));
        }
    }

    /**
     * 处理删除数据的监听方法
     * 当数据库中有数据删除操作时，此方法会被触发，用于执行相应的逻辑，当前只是简单打印提示信息，可根据实际需求扩展逻辑
     *
     * @param entry 包含了本次数据变更的详细信息，例如所属事务、对应的表等信息，通过它可解析出具体的行数据变更情况
     */
    @DeleteListenPoint
    public void onEventDelete(CanalEntry.Entry entry) {
        logger.info("监听到数据删除操作");
    }

    /**
     * 自定义的针对特定表数据更新的监听方法
     * 用于对指定的数据库（"dongyimaidb"）下特定表（"tb_content_category" 和 "tb_content"）的更新操作进行更个性化的监听处理
     *
     * @param entry     包含了本次数据变更的详细信息，例如所属事务、对应的表等信息，通过它可解析出具体的行数据变更情况
     * @param rowChange 表示行数据的变更对象，从中可以获取到更新后的具体行数据信息
     */
    @ListenPoint(destination = "example", schema = "dongyimaidb", table = {"tb_content_category", "tb_content"}, eventType = CanalEntry.EventType.UPDATE)
    public void onEventCustomUpdate(CanalEntry.Entry entry, CanalEntry.RowChange rowChange) {
        logger.error("监听到针对特定表的自定义更新操作，更新后的数据信息如下：");
        List<CanalEntry.RowData> rowDatas = rowChange.getRowDatasList();
        for (CanalEntry.RowData rowData : rowDatas) {
            rowData.getAfterColumnsList().forEach(column -> logger.info("字段名: {} ，字段值: {}", column.getName(), column.getValue()));
        }
    }
}
